package com.generic.test03.demo1;

import java.lang.reflect.Array;

/**
 * @author bin
 * @date 2025 - 03 -26
 **/
public class MyArrayList<T> {
    /**
     * 集合
     */
    private T[] elemData;

    public T[] getElemData() {
        return elemData;
    }

    public void setElemData(T[] elemData) {
        this.elemData = elemData;
    }



    public MyArrayList(){
    }

    /**
     * 带参数实例化
     * */
    public MyArrayList(Class<T> TypeClass,int Size){
        Object o = Array.newInstance(TypeClass, Size);
        elemData = (T[]) o;
    }

    /**
     * 动态扩容 - 原来长度 * 2
     * */
    public void ReSize(){
        Object o = Array.newInstance(elemData.getClass().getComponentType(), elemData.length * 2);
        elemData = (T[]) o;
    }
    /**
     * 指定长度扩容
     * */
    public void ReSize(int newSize){
        Object o = Array.newInstance(elemData.getClass().getComponentType(), newSize);
        elemData = (T[]) o;
    }
    /**
     * 添加元素
     * */
    public void add(T t){
        //判断是否需要扩容
        int size = size();
        if (size > elemData.length){
            //在原来的基础上加1
            ReSize(elemData.length + 1);
        }
        elemData[size] = t;
        //集合的实际个数+1
        size++;
    }

    /**
     * 删除元素
     * */
    public void remove(int index){
        for (int i = index; i < elemData.length; i++) {
            //如果是最后一个，则退出循环
            if(i == elemData.length-1){
                break;
            }
            elemData[i] = elemData[i+1];
        }
    }

    /**
     * 获取实际个数
     * */
    public int size(){
        int count  = 0;
        for (int i = 0; i < elemData.length; i++) {
            if(elemData[i] != null){
                count++;
            }
        }
       return count;
    }

    /**
     * 修改元素
     * */
    public void set(int index, T t){
        //如果没有这个下标 就结束方法
        if(index > elemData.length){
            System.out.println("没有这个下标");
            return;
        }
        elemData[index] = t;
    }

    /**
     * 通过下标获取元素
     * */
    public T get(int index){
        if(index > elemData.length){
            System.out.println("没有这个下标");
            return null;
        }
        return elemData[index];
    }

    /**
     * 判断集合是否为空
     * */
    public boolean isEmpty(){
        return size() == 0;
    }

    /**
     * 数组拷贝
     * */
    public T[] arrayCopy(T[] src, int srcPos, T[] dest, int destPos, int length){
        for (int i = 0; i <length ; i++) {
            //如果索引超出
            if(src.length < srcPos + i)
                break;
            //如果索引超出
            if(dest.length < destPos + i)
                break;
            dest[destPos + i] = src[i];
        }
        return dest;
    }
}
